package swardToOffer.struct_6_bit_operation;

/**
 * @Author ChanZany
 * @Date 2021/5/20 21:44
 * @Version 1.0
 * 面试题15：二进制中1的个数
 * 题目：请实现一个函数，输入一个整数，输出该数二进制表示中1的个数。例如
 * 把9表示成二进制是1001，有2位是1。因此如果输入9，该函数输出2。
 */
public class NumberOf1InBinary {
    //输入右移并与1(0x1)进行与操作，若与的结果是1说明有一个1
    int solution1(int n) {
        if (n == 0) return 0;
        int count = 0;
        while (n != 0) {
            count += n & 1;
            n = n >> 1;
        }
        return count;
    }

    //输入不动，让(0x1)按位左移
    int solution2(int n) {
        int count = 0;
        int flag = 1;
        while (flag != 0) {
            count += (n & flag)==0?0:1;
            flag = flag<<1;
        }
        return count;
    }
    //n & n-1 => n中1的数量减少1
    int solution3(int n) {
        int count = 0;
        while (n!=0){
            n = n & (n-1);
            count++;
        }
        return count;
    }

    public static void main(String[] args) {
        NumberOf1InBinary Main = new NumberOf1InBinary();
        System.out.println(Main.solution1(9));
        System.out.println(Main.solution2(9));
        System.out.println(Main.solution3(9));
    }
}
